Uitwisselprofiel ActiZ Belangenbehartiging

Over Uitwisselprofiel ActiZ Belangenbehartiging


Publicatiedatum:
18-09-2025

Inwerkingtreding:
18-09-2025

2.10 Wat is het aantal gemiddelde gewerkte periodes van personeelsleden in loondienst met een zorgverleners functie per kwalificatieniveau per Dag-, Avond- en Nacht-dienst (DAN-dienst)?

Concepten

Relaties

Eigenschappen

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: ActiZ 2.10
2# Parameters: ?jaar, ?kwartaal
3# Ontologie: versie 3.0 of nieuwer
4
5PREFIX ofn: <http://www.ontotext.com/sparql/functions/>
6PREFIX onz-g:   <http://purl.org/ozo/onz-g#>
7PREFIX onz-pers:<http://purl.org/ozo/onz-pers#>
8PREFIX onz-org: <http://purl.org/ozo/onz-org#>
9PREFIX rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
10PREFIX rdfs:    <http://www.w3.org/2000/01/rdf-schema#>
11PREFIX xsd:     <http://www.w3.org/2001/XMLSchema#>
12
13SELECT
14  (?vestiging AS ?Indeling)
15  (?zk_regio_code AS ?Zorgkantoorregiocode) 
16  ?kwalificatieniveau
17  (ROUND(SUM( xsd:decimal(?cntDag)   / xsd:decimal(?kalenderdagen) ) * 100) / 100 AS ?Aantal_gemiddelde_gewerkteperiode_dagdienst)
18  (ROUND(SUM( xsd:decimal(?cntAvond) / xsd:decimal(?kalenderdagen) ) * 100) / 100 AS ?Aantal_gemiddelde_gewerkteperiode_avonddienst)
19  (ROUND(SUM( xsd:decimal(?cntNacht) / xsd:decimal(?kalenderdagen) ) * 100) / 100 AS ?Aantal_gemiddelde_gewerkteperiode_nachtdienst)
20WHERE {
21    # Zorg dat alle kwalificatieniveaus altijd zichtbaar zijn
22    {
23        SELECT DISTINCT ?kwalificatieniveau {
24            {
25                ?functie
26                    a onz-pers:ZorgverlenerFunctie ;
27                    onz-g:hasQuality /onz-g:hasQualityValue ?functie_niveau .
28                ?functie_niveau
29                    a onz-pers:ODBKwalificatieWaarde ;
30                    rdfs:label ?kwalificatieniveau .
31            } 
32        }
33    }
34    
35    # Zorg dat alle vestigingen altijd zichtbaar zijn 
36    {
37        SELECT DISTINCT ?vestiging ?zk_regio_code {
38            {
39                ?vestiging_uri a onz-org:Vestiging ;
40                       			onz-g:identifiedBy ?vest_nr ;
41                       			onz-g:hasLocalizableArea/onz-g:identifiedBy/onz-g:hasPart/onz-g:hasPart ?postcode_6 .
42        		?vest_nr a onz-org:Vestigingsnummer ; onz-g:hasDataValue ?vestiging .
43
44        		BIND(IRI(SUBSTR(STR(?postcode_6), 1, STRLEN(STR(?postcode_6)) - 2)) AS ?postcode)
45        		?pc_gebied onz-g:identifiedBy ?postcode ; onz-g:partOf+ ?zk_regio .
46        		?zk_regio a onz-org:ZorgkantoorRegio .
47    
48     			BIND(IF(BOUND(?zk_regio), STRAFTER(STR(?zk_regio), "/onz-org/"), ?unbound) AS ?zk_regio_code)
49            } UNION {
50                # Tak 2: totaal organisatie, laat ?zk_regio ongebonden (leeg in output)
51                ?locatie onz-g:partOf* ?vestiging_uri .
52                ?vestiging_uri onz-org:vestigingVan ?organisatie_uri .
53                BIND("Totaal organisatie" AS ?vestiging)
54            }
55        }
56    }
57    
58    # Vul de rijen 
59    OPTIONAL {
60    SELECT
61      ?vestiging ?zk_regio_code ?kwalificatieniveau ?medewerker ?kalenderdagen
62      (SUM(IF(?start_uur >= 7  && ?start_uur < 15, 1, 0)) AS ?cntDag)
63      (SUM(IF(?start_uur >= 15 && ?start_uur < 23, 1, 0)) AS ?cntAvond)
64      (SUM(IF(?start_uur >= 23 || ?start_uur < 7,  1, 0)) AS ?cntNacht)
65    WHERE {
66      #BIND(2024 AS ?jaar)
67      #BIND("Q1" AS ?kwartaal)
68
69      BIND(
70        IF(?kwartaal = 'Q1', xsd:date(CONCAT(STR(?jaar), '-01-01')),
71        IF(?kwartaal = 'Q2', xsd:date(CONCAT(STR(?jaar), '-04-01')),
72        IF(?kwartaal = 'Q3', xsd:date(CONCAT(STR(?jaar), '-07-01')),
73        IF(?kwartaal = 'Q4', xsd:date(CONCAT(STR(?jaar), '-10-01')),
74           '' )))) AS ?start_periode)
75
76      BIND(?start_periode + "P3M"^^xsd:duration + "-P1D"^^xsd:duration AS ?eind_periode)
77
78      # Hardcoded kalenderdagen (Check voor schrikkeljaar)
79      # Divisible by 400 OR (divisible by 4 AND not divisible by 100)
80      BIND(((ofn:floorMod(?jaar, 400) = 0) ||((ofn:floorMod(?jaar, 4) = 0) && (ofn:floorMod(?jaar, 100) != 0)))AS ?isSchrikkel)
81            
82      BIND(
83        IF(?kwartaal = "Q1", IF(?isSchrikkel, 91, 90),
84        IF(?kwartaal = "Q2", 91,
85        IF(?kwartaal = "Q3", 92,
86        IF(?kwartaal = "Q4", 92, 0))))
87        AS ?kalenderdagen)
88
89      # DAN-venster 07:00 → 06:59
90      BIND(xsd:dateTime(CONCAT(STR(?start_periode), "T07:00:00")) AS ?dan_start)
91      BIND(?eind_periode + "P1D"^^xsd:duration AS ?eind_periode_plus)
92      BIND(xsd:dateTime(CONCAT(STR(?eind_periode_plus), "T06:59:00")) AS ?dan_end)
93
94      # Werkperiode
95      ?gewerkte_periode a onz-pers:GewerktePeriode ;
96                        onz-g:definedBy ?overeenkomst ;
97                        onz-g:hasBeginTimeStamp ?start_werk ;
98                        onz-g:hasEndTimeStamp   ?eind_werk .
99      FILTER(?start_werk >= ?dan_start && ?start_werk <= ?dan_end)
100
101      # Overeenkomst geldig
102      ?overeenkomst a onz-pers:ArbeidsOvereenkomst ;
103                    onz-pers:heeftOpdrachtnemer ?medewerker ;
104                    onz-g:hasPart ?overeenkomst_afspraak .
105
106      ?overeenkomst_afspraak a onz-pers:WerkOvereenkomstAfspraak ;
107                             onz-g:startDatum ?start_afspraak ;
108                             onz-g:isAbout ?functie .
109      OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
110      FILTER (?start_afspraak <= ?eind_periode_plus &&
111              (!BOUND(?eind_afspraak) || ?eind_afspraak >= ?start_periode))
112
113      # Functie / kwalificatieniveau
114      ?functie a onz-pers:ZorgverlenerFunctie ;
115               onz-g:hasQuality/onz-g:hasQualityValue ?functie_niveau .
116      ?functie_niveau a onz-pers:ODBKwalificatieWaarde ; rdfs:label ?kwalificatieniveau .
117
118      # 1) Afspraak-locatie (naast de functie aan dezelfde afspraak gekoppeld)
119      ?overeenkomst_afspraak onz-g:isAbout ?locatie_afspraak .
120      ?locatie_afspraak a onz-g:StationaryArtifact .
121
122      # 2) Optioneel een werk-locatie op de gewerkte periode
123      OPTIONAL { ?gewerkte_periode onz-g:hasPerdurantLocation ?locatie_werk . }
124
125      # 3) Kies: werk-locatie als die bestaat, anders de afspraak-locatie
126      BIND(IF(!BOUND(?locatie_werk), ?locatie_afspraak, ?locatie_werk) AS ?locatie)
127
128      {
129        # Tak 1: echte vestiging + afleiding zorgkantoorregio
130        ?locatie onz-g:partOf* ?vestiging_uri .
131        ?vestiging_uri a onz-org:Vestiging ;
132                       onz-g:identifiedBy ?vest_nr ;
133                       onz-g:hasLocalizableArea/onz-g:identifiedBy/onz-g:hasPart/onz-g:hasPart ?postcode_6 .
134        ?vest_nr a onz-org:Vestigingsnummer ; onz-g:hasDataValue ?vestiging .
135
136        BIND(IRI(SUBSTR(STR(?postcode_6), 1, STRLEN(STR(?postcode_6)) - 2)) AS ?postcode)
137        ?pc_gebied onz-g:identifiedBy ?postcode ; onz-g:partOf+ ?zk_regio .
138        ?zk_regio a onz-org:ZorgkantoorRegio .
139      }
140      UNION
141      {
142        # Tak 2: totaal organisatie, laat ?zk_regio ongebonden (leeg in output)
143        ?locatie onz-g:partOf* ?vestiging_uri .
144        ?vestiging_uri onz-org:vestigingVan ?organisatie_uri .
145        BIND("Totaal organisatie" AS ?vestiging)
146      }
147
148      BIND(IF(BOUND(?zk_regio), STRAFTER(STR(?zk_regio), "/onz-org/"), ?unbound) AS ?zk_regio_code)
149
150      # Uur uit starttijd
151      BIND(HOURS(?start_werk) AS ?start_uur)
152    }
153    GROUP BY ?vestiging ?zk_regio_code ?kwalificatieniveau ?medewerker ?kalenderdagen
154  }
155}
156GROUP BY ?vestiging ?zk_regio_code ?kwalificatieniveau
157ORDER BY ?vestiging ?kwalificatieniveau
158